package com.cy.jt.demo.controller;

import org.springframework.context.annotation.Lazy;
import org.springframework.web.bind.annotation.*;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 通过此对象对C(create)R(retrieve)U(update)D(delete)请求的处理
 * restful  规范 = 动作 + url
 * @GetMapring   读取数据
 * @PostMapping   保存数据
 * @PutMapping     更新数据
 * @DeleteMapping  删除数据
 * @PatchMapping  更新局部数据
 */
//@Lazy  //延时加载特性   没有该注解   --springboot启动时就会创建对象  大对象比较占用资源时又长时间不用可以使用该注解
@RestController  //@Controller+@ResponseBody
@RequestMapping("/demo/")
public class DemoController {
    //springboot启动时就会创建对象
    public DemoController(){
        System.out.println("DemoController()");
    }



////    @RequestMapping  --会自动匹配你的请求方式，所以不会报错，
////    请求方式: http://localhost:8080/demo/?id=1,2,3,4,5    换成DeleteMapping时会报405异常
//    @DeleteMapping
//    //请求方式: http://localhost:8080/demo/?id=1,2,3,4,5 在浏览器默认为get请求
//    //请求方式与处理方式不匹配的时候，页面会报405异常
//    public String doDeleteById(Integer ...id){
//        //...
//        return Arrays.toString(id) + "is delete";
//    }
    //    @RequestMapping
    @DeleteMapping ("{id}")
    //请求方式: http://localhost:8080/demo/1,2,3,4,5
    // 以上这种方式传值服务器端得使用restful风格的url
    //请求方式:http://localhost:8080/demo/1,hello   --客户端会报400异常
    // 说明：表示客户端向服务端传递的参数格式，类型，个数可能不匹配
    public String doDeleteById(@PathVariable Integer ...id){
        //...
        return Arrays.toString(id) + "is delete";
    }

        /**
         * 统计本方法的访问次数
         * 用Java 中的J.U.C包装的API  线程安全
         * getAndIncrement() --递增
         */
//    private int count;
    //java中J.U.C包装的一个API  线程安全的（保证了原子性）用到了CAS算法
    //J.U.C  包下的线程安全的对象（提供了长整型数据的原子操作，底层CAS算法）
    private AtomicLong counter = new AtomicLong();
    @GetMapping("{id}")
    public String doRetrieveById(@PathVariable Integer id) throws Exception {
        String tName = Thread.currentThread().getName();
//        count++;//用加加会导致线程不安全
//        System.out.println(count);
        System.out.println(counter.getAndIncrement());//递增
        //Thread.sleep(3000); //休眠三秒钟  Java中的API
        TimeUnit.SECONDS.sleep(3); //休眠三秒钟  Java中的API
        return tName + "find result by"+id;
    }



    //请求的路径：http：//ip地址：port/demo/
    //请求类型内容：Content-Type：Application/json
    //内容格式：{"id":1,"msg":"HelloWorld"}
    @PostMapping
    public String doCreate(@RequestBody Map<String,Object> map){
        return map.toString() + "is created";
    }
    @PutMapping
    public String doUpdate(@RequestBody Map<String,Object> map){
        return map.toString() + "is update";
    }
}
